{
  "bundles": [
    {
      "@type": "NXBundle",
      "artifactId": "nuxeo-automation-scripting",
      "artifactVersion": "2023.12.6",
      "bundleGroup": {
        "@type": "NXBundleGroup",
        "bundleIds": [
          "org.nuxeo.ecm.automation.core",
          "org.nuxeo.ecm.automation.features",
          "org.nuxeo.ecm.automation.io",
          "org.nuxeo.ecm.automation.jsf",
          "org.nuxeo.ecm.automation.scripting",
          "org.nuxeo.ecm.automation.server"
        ],
        "hierarchyPath": "/grp:org.nuxeo.ecm.automation",
        "id": "grp:org.nuxeo.ecm.automation",
        "name": "org.nuxeo.ecm.automation",
        "parentIds": [],
        "readmes": [],
        "version": "2023.12"
      },
      "bundleId": "org.nuxeo.ecm.automation.scripting",
      "components": [
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.core.operation.OperationServiceComponent--contextHelpers",
              "hierarchyPath": "/grp:org.nuxeo.ecm.automation/org.nuxeo.ecm.automation.scripting/org.nuxeo.ecm.core.automation.scripting.contextContrib/Contributions/org.nuxeo.ecm.core.automation.scripting.contextContrib--contextHelpers",
              "id": "org.nuxeo.ecm.core.automation.scripting.contextContrib--contextHelpers",
              "registrationOrder": 1,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.core.operation.OperationServiceComponent",
                "name": "org.nuxeo.ecm.core.operation.OperationServiceComponent",
                "type": "service"
              },
              "version": "2023.12.6",
              "xml": "<extension point=\"contextHelpers\" target=\"org.nuxeo.ecm.core.operation.OperationServiceComponent\">\n    <contextHelper class=\"org.nuxeo.automation.scripting.helper.Console\" id=\"Console\"/>\n  </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.ecm.automation/org.nuxeo.ecm.automation.scripting/org.nuxeo.ecm.core.automation.scripting.contextContrib",
          "name": "org.nuxeo.ecm.core.automation.scripting.contextContrib",
          "requirements": [],
          "resolutionOrder": 69,
          "services": [],
          "startOrder": 126,
          "version": "2023.12.6",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.ecm.core.automation.scripting.contextContrib\" version=\"1.0\">\n\n  <extension target=\"org.nuxeo.ecm.core.operation.OperationServiceComponent\"\n             point=\"contextHelpers\">\n    <contextHelper id=\"Console\" class=\"org.nuxeo.automation.scripting.helper.Console\"/>\n  </extension>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/helpers-contrib.xml",
          "xmlPureComponent": true
        },
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.automation.scripting.internals.AutomationScriptingComponent--classFilter",
              "hierarchyPath": "/grp:org.nuxeo.ecm.automation/org.nuxeo.ecm.automation.scripting/org.nuxeo.automation.scripting.classfilter/Contributions/org.nuxeo.automation.scripting.classfilter--classFilter",
              "id": "org.nuxeo.automation.scripting.classfilter--classFilter",
              "registrationOrder": 0,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.automation.scripting.internals.AutomationScriptingComponent",
                "name": "org.nuxeo.automation.scripting.internals.AutomationScriptingComponent",
                "type": "service"
              },
              "version": "2023.12.6",
              "xml": "<extension point=\"classFilter\" target=\"org.nuxeo.automation.scripting.internals.AutomationScriptingComponent\">\n    <classFilter>\n      <allow>java.text.SimpleDateFormat</allow>\n      <allow>java.util.ArrayList</allow>\n      <allow>java.util.Arrays</allow>\n      <allow>java.util.Collections</allow>\n      <allow>java.util.UUID</allow>\n      <allow>org.apache.commons.codec.digest.DigestUtils</allow>\n      <allow>org.nuxeo.runtime.transaction.TransactionHelper</allow>\n      <allow>org.nuxeo.ecm.core.api.Blobs</allow>\n      <allow>org.nuxeo.ecm.core.api.impl.blob.StringBlob</allow>\n      <allow>org.nuxeo.ecm.core.api.impl.blob.JSONBlob</allow>\n      <allow>org.nuxeo.ecm.core.api.NuxeoException</allow>\n    </classFilter>\n  </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.ecm.automation/org.nuxeo.ecm.automation.scripting/org.nuxeo.automation.scripting.classfilter",
          "name": "org.nuxeo.automation.scripting.classfilter",
          "requirements": [],
          "resolutionOrder": 70,
          "services": [],
          "startOrder": 46,
          "version": "2023.12.6",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.automation.scripting.classfilter\" version=\"1.0\">\n\n  <extension target=\"org.nuxeo.automation.scripting.internals.AutomationScriptingComponent\" point=\"classFilter\">\n    <classFilter>\n      <allow>java.text.SimpleDateFormat</allow>\n      <allow>java.util.ArrayList</allow>\n      <allow>java.util.Arrays</allow>\n      <allow>java.util.Collections</allow>\n      <allow>java.util.UUID</allow>\n      <allow>org.apache.commons.codec.digest.DigestUtils</allow>\n      <allow>org.nuxeo.runtime.transaction.TransactionHelper</allow>\n      <allow>org.nuxeo.ecm.core.api.Blobs</allow>\n      <allow>org.nuxeo.ecm.core.api.impl.blob.StringBlob</allow>\n      <allow>org.nuxeo.ecm.core.api.impl.blob.JSONBlob</allow>\n      <allow>org.nuxeo.ecm.core.api.NuxeoException</allow>\n    </classFilter>\n  </extension>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/classfilter-contrib.xml",
          "xmlPureComponent": true
        },
        {
          "@type": "NXComponent",
          "componentClass": "org.nuxeo.automation.scripting.internals.AutomationScriptingComponent",
          "documentation": "\n    Automation Scripting is a Nuxeo module which provides ability to create and contribute Automation chain/operation in JavaScript.\n\n    For backward compatibility with version prior to 9.1, you may want to inline the context in the scripting parameters by contributing the\n    extension\n    <code>\n    <extension point=\"configuration\" target=\"org.nuxeo.runtime.ConfigurationService\">\n        <property name=\"nuxeo.automation.scripting.inline-context-in-params\">true</property>\n    </extension>\n</code>\n",
          "documentationHtml": "<p>\nAutomation Scripting is a Nuxeo module which provides ability to create and contribute Automation chain/operation in JavaScript.\n</p><p>\nFor backward compatibility with version prior to 9.1, you may want to inline the context in the scripting parameters by contributing the\nextension\n</p><p></p><pre><code>    &lt;extension point&#61;&#34;configuration&#34; target&#61;&#34;org.nuxeo.runtime.ConfigurationService&#34;&gt;\n        &lt;property name&#61;&#34;nuxeo.automation.scripting.inline-context-in-params&#34;&gt;true&lt;/property&gt;\n    &lt;/extension&gt;\n</code></pre><p></p>",
          "extensionPoints": [
            {
              "@type": "NXExtensionPoint",
              "componentId": "org.nuxeo.automation.scripting.internals.AutomationScriptingComponent",
              "descriptors": [
                "org.nuxeo.automation.scripting.internals.ScriptingOperationDescriptor"
              ],
              "documentation": "<code>\n    <scriptedOperation id=\"Scripting.HelloWorld\">\n        <inputType>string</inputType>\n        <outputType>string</outputType>\n        <param name=\"lang\" type=\"string\"/>\n        <script>\n          function run(input, params) {\n          if (params.lang === \"fr\") {\n          return \"Bonjour \" + input;\n          } else {\n          return \"Hello \" + input;\n          }\n          }\n        </script>\n    </scriptedOperation>\n</code>\n",
              "documentationHtml": "<p>\n</p><pre><code>    &lt;scriptedOperation id&#61;&#34;Scripting.HelloWorld&#34;&gt;\n        &lt;inputType&gt;string&lt;/inputType&gt;\n        &lt;outputType&gt;string&lt;/outputType&gt;\n        &lt;param name&#61;&#34;lang&#34; type&#61;&#34;string&#34;/&gt;\n        &lt;script&gt;\n          function run(input, params) {\n          if (params.lang &#61;&#61;&#61; &#34;fr&#34;) {\n          return &#34;Bonjour &#34; &#43; input;\n          } else {\n          return &#34;Hello &#34; &#43; input;\n          }\n          }\n        &lt;/script&gt;\n    &lt;/scriptedOperation&gt;\n</code></pre><p></p>",
              "hierarchyPath": "/grp:org.nuxeo.ecm.automation/org.nuxeo.ecm.automation.scripting/org.nuxeo.automation.scripting.internals.AutomationScriptingComponent/ExtensionPoints/org.nuxeo.automation.scripting.internals.AutomationScriptingComponent--operation",
              "id": "org.nuxeo.automation.scripting.internals.AutomationScriptingComponent--operation",
              "label": "operation (org.nuxeo.automation.scripting.internals.AutomationScriptingComponent)",
              "name": "operation",
              "version": "2023.12.6"
            },
            {
              "@type": "NXExtensionPoint",
              "componentId": "org.nuxeo.automation.scripting.internals.AutomationScriptingComponent",
              "descriptors": [
                "org.nuxeo.automation.scripting.internals.ClassFilterDescriptor"
              ],
              "documentation": "\n      This can be used to allow additional classes to be accessible by the scripting engine.\n      The deny element can be used to disallow classes allowed by previous contributions.\n      By default, no classes are allowed.\n\n      @since 10.2\n      <code>\n    <classFilter>\n        <allow>java.util.ArrayList</allow>\n        <allow>java.util.UUID</allow>\n        <deny>java.io.File</deny>\n        <deny>java.lang.Class</deny>\n    </classFilter>\n</code>\n\n\n      To deny everything from previous contributions and only allow specific classes, use:\n      <code>\n    <classFilter>\n        <deny>*</deny>\n        <allow>java.util.ArrayList</allow>\n    </classFilter>\n</code>\n",
              "documentationHtml": "<p>\nThis can be used to allow additional classes to be accessible by the scripting engine.\nThe deny element can be used to disallow classes allowed by previous contributions.\nBy default, no classes are allowed.\n</p><p>\n&#64;since 10.2\n</p><p></p><pre><code>    &lt;classFilter&gt;\n        &lt;allow&gt;java.util.ArrayList&lt;/allow&gt;\n        &lt;allow&gt;java.util.UUID&lt;/allow&gt;\n        &lt;deny&gt;java.io.File&lt;/deny&gt;\n        &lt;deny&gt;java.lang.Class&lt;/deny&gt;\n    &lt;/classFilter&gt;\n</code></pre><p>\nTo deny everything from previous contributions and only allow specific classes, use:\n</p><p></p><pre><code>    &lt;classFilter&gt;\n        &lt;deny&gt;*&lt;/deny&gt;\n        &lt;allow&gt;java.util.ArrayList&lt;/allow&gt;\n    &lt;/classFilter&gt;\n</code></pre><p></p>",
              "hierarchyPath": "/grp:org.nuxeo.ecm.automation/org.nuxeo.ecm.automation.scripting/org.nuxeo.automation.scripting.internals.AutomationScriptingComponent/ExtensionPoints/org.nuxeo.automation.scripting.internals.AutomationScriptingComponent--classFilter",
              "id": "org.nuxeo.automation.scripting.internals.AutomationScriptingComponent--classFilter",
              "label": "classFilter (org.nuxeo.automation.scripting.internals.AutomationScriptingComponent)",
              "name": "classFilter",
              "version": "2023.12.6"
            }
          ],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentation": "\n       Configuration property for enabling backward compatibility with scripting parameters where\n       context variables were inlined.\n     \n",
              "documentationHtml": "<p>\nConfiguration property for enabling backward compatibility with scripting parameters where\ncontext variables were inlined.\n</p><p></p>",
              "extensionPoint": "org.nuxeo.runtime.ConfigurationService--configuration",
              "hierarchyPath": "/grp:org.nuxeo.ecm.automation/org.nuxeo.ecm.automation.scripting/org.nuxeo.automation.scripting.internals.AutomationScriptingComponent/Contributions/org.nuxeo.automation.scripting.internals.AutomationScriptingComponent--configuration",
              "id": "org.nuxeo.automation.scripting.internals.AutomationScriptingComponent--configuration",
              "registrationOrder": 64,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.runtime.ConfigurationService",
                "name": "org.nuxeo.runtime.ConfigurationService",
                "type": "service"
              },
              "version": "2023.12.6",
              "xml": "<extension point=\"configuration\" target=\"org.nuxeo.runtime.ConfigurationService\">\n     <documentation>\n       Configuration property for enabling backward compatibility with scripting parameters where\n       context variables were inlined.\n     </documentation>\n     <property name=\"nuxeo.automation.scripting.inline-context-in-params\">false</property>\n   </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.ecm.automation/org.nuxeo.ecm.automation.scripting/org.nuxeo.automation.scripting.internals.AutomationScriptingComponent",
          "name": "org.nuxeo.automation.scripting.internals.AutomationScriptingComponent",
          "requirements": [
            "org.nuxeo.ecm.core.operation.OperationServiceComponent"
          ],
          "resolutionOrder": 808,
          "services": [
            {
              "@type": "NXService",
              "componentId": "org.nuxeo.automation.scripting.internals.AutomationScriptingComponent",
              "hierarchyPath": "/grp:org.nuxeo.ecm.automation/org.nuxeo.ecm.automation.scripting/org.nuxeo.automation.scripting.internals.AutomationScriptingComponent/Services/org.nuxeo.automation.scripting.api.AutomationScriptingService",
              "id": "org.nuxeo.automation.scripting.api.AutomationScriptingService",
              "overriden": false,
              "version": "2023.12.6"
            }
          ],
          "startOrder": 779,
          "version": "2023.12.6",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.automation.scripting.internals.AutomationScriptingComponent\" version=\"1.0\">\n\n   <documentation>\n    Automation Scripting is a Nuxeo module which provides ability to create and contribute Automation chain/operation in JavaScript.\n\n    For backward compatibility with version prior to 9.1, you may want to inline the context in the scripting parameters by contributing the\n    extension\n    <code>\n      <extension target=\"org.nuxeo.runtime.ConfigurationService\" point=\"configuration\">\n        <property name=\"nuxeo.automation.scripting.inline-context-in-params\">true</property>\n      </extension>\n    </code>\n  </documentation>\n\n  <require>org.nuxeo.ecm.core.operation.OperationServiceComponent</require>\n\n  <implementation class=\"org.nuxeo.automation.scripting.internals.AutomationScriptingComponent\" />\n\n  <service>\n      <provide interface=\"org.nuxeo.automation.scripting.api.AutomationScriptingService\" />\n  </service>\n\n   <extension target=\"org.nuxeo.runtime.ConfigurationService\" point=\"configuration\">\n     <documentation>\n       Configuration property for enabling backward compatibility with scripting parameters where\n       context variables were inlined.\n     </documentation>\n     <property name=\"nuxeo.automation.scripting.inline-context-in-params\">false</property>\n   </extension>\n\n  <extension-point name=\"operation\">\n    <documentation>\n      <code>\n      <scriptedOperation id=\"Scripting.HelloWorld\">\n        <inputType>string</inputType>\n        <outputType>string</outputType>\n        <param name=\"lang\" type=\"string\"/>\n        <script>\n          function run(input, params) {\n          if (params.lang === \"fr\") {\n          return \"Bonjour \" + input;\n          } else {\n          return \"Hello \" + input;\n          }\n          }\n        </script>\n      </scriptedOperation>\n      </code>\n    </documentation>\n\n    <object\n      class=\"org.nuxeo.automation.scripting.internals.ScriptingOperationDescriptor\" />\n  </extension-point>\n\n  <extension-point name=\"classFilter\">\n    <documentation>\n      This can be used to allow additional classes to be accessible by the scripting engine.\n      The deny element can be used to disallow classes allowed by previous contributions.\n      By default, no classes are allowed.\n\n      @since 10.2\n      <code>\n        <classFilter>\n          <allow>java.util.ArrayList</allow>\n          <allow>java.util.UUID</allow>\n          <deny>java.io.File</deny>\n          <deny>java.lang.Class</deny>\n        </classFilter>\n      </code>\n\n      To deny everything from previous contributions and only allow specific classes, use:\n      <code>\n        <classFilter>\n          <deny>*</deny>\n          <allow>java.util.ArrayList</allow>\n        </classFilter>\n      </code>\n\n    </documentation>\n\n    <object class=\"org.nuxeo.automation.scripting.internals.ClassFilterDescriptor\" />\n  </extension-point>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/automation-scripting-service.xml",
          "xmlPureComponent": false
        }
      ],
      "fileName": "nuxeo-automation-scripting-2023.12.6.jar",
      "groupId": "org.nuxeo.ecm.automation",
      "hierarchyPath": "/grp:org.nuxeo.ecm.automation/org.nuxeo.ecm.automation.scripting",
      "id": "org.nuxeo.ecm.automation.scripting",
      "location": "",
      "manifest": "Manifest-Version: 1.0\r\nArchiver-Version: Plexus Archiver\r\nCreated-By: Apache Maven 3.9.6\r\nBuilt-By: root\r\nBuild-Jdk: 17.0.11\r\nBundle-ManifestVersion: 2\r\nBundle-Version: 2023.12.6-t20240513-130833\r\nBundle-Vendor: Nuxeo\r\nBundle-ActivationPolicy: lazy\r\nBundle-ClassPath: .\r\nBundle-Name: org.nuxeo.ecm.automation.scripting\r\nBundle-SymbolicName: org.nuxeo.ecm.automation.scripting\r\nNuxeo-Component: OSGI-INF/automation-scripting-service.xml,OSGI-INF/help\r\n ers-contrib.xml,OSGI-INF/classfilter-contrib.xml\r\n\r\n",
      "maxResolutionOrder": 808,
      "minResolutionOrder": 69,
      "packages": [],
      "readme": {
        "blobProviderId": "default",
        "content": "## About\n\nThis module is a work in progress for allowing to use JavaScript\n\n - as an Automation based DSL to write custom extensions\n - to create \"Automation chains\"\n\n## Motivations\n\nThe initial idea comes from the following constations :\n\n - Automation Operations are a good High Level API : people succeed is doing amazing stuffs with it\n - Automation Chain control flow is too primitive\n     - loops are complex\n     - conditions are complex\n     - reusing \"code segment\" forces using several chains and makes maintenability more complex\n\nSo, the idea is to use a simple scripting language to manage the control flow and give accees to the Automation API.\n\n## Example :\n\nHere is a example of an Automation Script :\n\n    var root = Document.Fetch(null, {\n        \"value\": \"/\"\n    });\n\n    var newDocs = [];\n    for (var i = 1; i < 10; i++) {\n\n        var newDoc = Document.Create(root, {\n            \"type\": \"File\",\n            \"name\": \"newDoc\" + i,\n            \"properties\": {\n                \"dc:title\": \"New Title\" + i,\n                \"dc:source\": \"JavaScript\",\n                \"dc:subjects\": [\"from\", \"javascript\"]\n            }\n        });\n        var lastUUIDDigit = parseInt(newDoc.getId().slice(-1));\n        if (lastUUIDDigit % 2 == 0) {\n            newDoc = Document.Update(newDoc, {\n                \"properties\": {\n                    \"dc:nature\": \"even\"\n                }\n            });\n        } else {\n            newDoc = Document.Update(newDoc, {\n                \"properties\": {\n                    \"dc:nature\": \"odd\"\n                }\n            });\n        }\n        newDocs.push(newDoc);\n    }\n\n    var evenDocs = Document.Query(null, {\n        \"query\": \"select * from Document where dc:nature='even'\"\n    });\n\n    println(\"Created \" + evenDocs.size() + \" even Documents\");\n\n\nHere is an exemple of an \"Automation Chain\" defined via a script\n\n\n      <scriptedOperation id=\"Scripting.AddFacetInSubTree\">\n         <inputType>Document</inputType>\n         <outputType>Documents</outputType>\n         <param name=\"facet\" type=\"string\"/>\n         <param name=\"type\" type=\"string\"/>\n\n         <script><![CDATA[\n           function run(ctx, input, params) {\n\n             var query = \"select * from \" + params.type + \" where ecm:path startswith '\";\n             query = query + input.getPathAsString();\n             query = query + \"'\";\n\n             //println(\"query = \" + query);\n             var subDocs = Document.Query(null, {\n\t\t\t\"query\": query\n\t\t   });\n\n\t\t   //println(\"Query run with \" + subDocs.size() + \" result\");\n\n\t\t   var updated = [];\n\t\t   for (var i = 0; i < subDocs.size(); i++) {\n\t\t      var doc = subDocs.get(i);\n\t\t      if (!doc.hasFacet(params.facet)) {\n\t\t         doc.addFacet(params.facet);\n\t\t         updated.push(Document.Save(doc,{}));\n\t\t      }\n\t\t   }\n             return updated;\n           }\n           ]]>\n         </script>\n      </scriptedOperation>\n",
        "digest": "000ca69d81d835796271d95d4b8e16ff",
        "encoding": "UTF-8",
        "length": 2896,
        "mimeType": "text/plain",
        "name": "Readme.md"
      },
      "requirements": [],
      "version": "2023.12.6"
    }
  ],
  "creationDate": 1716285025814,
  "key": "Nuxeo Platform-2023.12",
  "name": "Nuxeo Platform",
  "operations": [],
  "packages": [],
  "pluginSnapshots": {},
  "releaseDate": 1716285025814,
  "version": "2023.12"
}